package com.xialuo.study.tools;

import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.stereotype.Component;

/**
 * 代码执行工具，用于计算数字的平方根
 */
@Component
@Slf4j
public class MathTool {

    @Tool(description = "计算平方根的数字的请求对象")
    Response calNumberSqrt(@ToolParam(description = "要计算平方根的数字") Request request) {
        log.info("计算平方根: {}", request.code());

        try {
            // 从代码中提取数字
            String code = request.code().trim();
            double number = extractNumberFromCode(code);

            if (number < 0) {
                return new Response("无法计算负数的平方根", false, "输入必须是非负数");
            }

            // 计算平方根
            double squareRoot = Math.sqrt(number);
            String result = String.format("%.4f", squareRoot);

            log.info("平方根计算结果: {}", result);
            return new Response(result, true, "平方根计算成功");

        } catch (Exception e) {
            log.error("计算平方根时发生错误", e);
            return new Response("", false, "计算平方根时发生错误: " + e.getMessage());
        }
    }


    /**
     * 从代码字符串中提取数字
     *
     * @param code 代码字符串
     * @return 提取的数字
     */
    private double extractNumberFromCode(String code) {
        // 尝试直接解析数字
        try {
            return Double.parseDouble(code);
        } catch (NumberFormatException e) {
            // 如果不是直接的数字，尝试从代码中提取
            // 这里处理常见的计算平方根的代码模式
            if (code.contains("Math.sqrt(") || code.contains("sqrt(")) {
                // 提取括号中的内容
                int startIndex = code.indexOf('(');
                int endIndex = code.indexOf(')', startIndex);
                if (startIndex >= 0 && endIndex > startIndex) {
                    String numberStr = code.substring(startIndex + 1, endIndex).trim();
                    return Double.parseDouble(numberStr);
                }
            }

            // 尝试查找数字模式
            String[] words = code.split("\\s+");
            for (String word : words) {
                try {
                    return Double.parseDouble(word);
                } catch (NumberFormatException ex) {
                    // 继续尝试下一个单词
                }
            }

            // 如果找不到数字，默认返回0
            return 0;
        }
    }

    /**
     * 代码执行请求对象
     *
     * @param code 要执行的代码或数字
     */
    public record Request(String code) {
    }

    /**
     * 代码执行响应对象
     *
     * @param result 执行结果
     * @param success 是否执行成功
     * @param message 执行消息
     */
    public record Response(String result, boolean success, String message) {
    }
}
